package com.cgwx.common.utils;


import com.alibaba.fastjson.JSONObject;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;

/**
 * @ClassName Page
 * @Description 对List直接分页，适用于检索后需要筛选分类的分页操作
 * @Version V1.0 czh
 */

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Page<T> implements Serializable {

    private List<T> records; //最终查询的结果记录
    private long total; //共有多少条记录
    private long size;  //一页显示多少条
    private long current; //取第几页显示
    private long pages; //总共几页
    private long startIndex; //从哪里开始截取集合的下标

    //获取初始化分页对象 这里用long类型是为了与mybatisplus保持一致
    public Page<T> getPage(long total, long size, long current) {
        Page<T> page = new Page<>();
        page.setTotal(total);
        page.setSize(size);
        //总页数的计算 如果集合总记录数能被入参size（一页几条）整除，则为对应商，否则多出部分也独立算一页
        page.setPages(total % size == 0 ? total / size : total / size + 1);
        //前端约定入参从1开始，但此处入参调用时会减1，此处+1恢复原值供前端展示
        page.setCurrent(current+1);
        //开始索引的设置
        page.setStartIndex(size * current);
        return page;
    }

    public List<T> startPage(long total, long current, long size, List<T> obj){
        List<T> result = new ArrayList<>();
        //获取初始化分页结构
        Page<JSONObject> page = new Page().getPage(total, size, current-1);
        //获取集合下标初始值
        long startIndex = page.getStartIndex();
        //获取集合下标结束值
        long endInddex = 0;
        /*
        当前页显示个数不足展示整个pageSize
         */
        if(startIndex + page.getSize() > total){
            endInddex = total;
        }else {
            /*
            当前页个数显示完全
             */
            //否则为startIndex（size * current 从哪里开始取）加上一页显示多少条得到结束值
            endInddex = startIndex  + page.getSize();
        }
        //如果输入的开始查询下标大于等于集合大小，则查询为空值
        if(startIndex >= total){
            result = Collections.emptyList();
        }else{
            result = obj.subList((int)startIndex,(int)endInddex);
        }
        return result;
    }
}
